package mystudy
// 面向对象-继承
import "fmt"

/*
人父类
*/
// 定义父类结构体
type People struct{
    Name string
    Age int
}

func (p *People)setName(name string){
	(*p).Name = name
}

// 定义父类方法
func (p People)showInfo()string{
	fmt.Println("父类方法showInfo")
    message := fmt.Sprintf("我的名字：%v 我的年龄:%v",p.Name, p.Age)
    return message
}
// 定义父类方法
func (p People)whoami(){
	fmt.Println("我是谁：", p.Name)
}

/*
父类：People2
*/
type People2 struct{
	Name string
	Age int
	high int
}

/*
学生子类
*/

// 定义子类结构体
type Student struct{
	People
	People2
	notes string
}
// 定义子类发方法
func(s Student) showInfo()(message string){
	// 子类的方法如果和父类同名，那么就必须参数和返回值都是一样的，否则就会报错
	fmt.Println("子类方法showInfo")
    message = fmt.Sprintf("我的名字：%v 我的年龄:%v", s.People.Name, s.People2.Age)
	fmt.Println(message)
	return 
}

type Student2 struct{
    People
    int
    float32
}

type Student3 struct{
	*People
	int
}


func DemoJc(){
	// 声明一个对象
	fmt.Println("------面向对象-继承------")
	var s1 = Student{People{"关关", 19},People2{"关关2", 20, 88}, "前任2"}
	message := s1.showInfo()
	fmt.Println(message)
	fmt.Println("==重新设置新的名字：盈盈")
	s1.setName("颖颖")
	message = s1.showInfo()
	fmt.Println(message)
	st2 := Student2{People{"学生2", 22}, 18,19}
	fmt.Println(st2)
	fmt.Println(st2.int)
	fmt.Println(st2.float32)
	st3 := Student2{
		People:People{
			Name:"学生3",
			Age:22,
		},
		int:19,
		float32:99,
	}
	fmt.Println(st3)

	st4 := Student3{
		&People{"李华", 22}, 88,
	}
	fmt.Println(st4)
	fmt.Println(st4.People)
	fmt.Println(*(st4.People))
}